package com.gao.alg.geek;

/**
 * 盛水最多的容器：
 *
 * 给定一个长度为 n 的整数数组 height 。有 n 条垂线，第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
 *
 * 找出其中的两条线，使得它们与 x 轴共同构成的容器可以容纳最多的水。
 *
 * 返回容器可以储存的最大水量。
 *
 * 解题思路： 缩减搜索空间；双指针
 */
public class MaxArea {


    /**暴力求出面积最大值
     * @param height
     * @return
     */
    public int maxArea(int[] height) {
        int maxArea  = 0;
        for (int i = 0; i < height.length; i++) {
            for (int j = i+1; j < height.length; j++) {
                maxArea = Math.max(maxArea,(j-i)*Math.min(height[i],height[j]));
            }
        }
       return maxArea;
    }

    /**
     *左右夹逼
     */
    public int maxArea2(int[] height) {
        int max = 0;
        for (int i = 0,j=height.length-1; i < j;) {
            int minHeight = height[i]<height[j]?height[i++] : height[j--];
            max = Math.max(max,(j-i+1)*minHeight);
        }
        return max;
    }

    /**
     *左右夹逼
     */
    public int maxAreaReview(int[] height) {
        int max = 0;
        for (int i = 0,j=height.length-1; i < j;) {
            boolean f = height[i]>=height[j];
            max = Math.max(max,(j-i)* (f?height[j]:height[i]));
            if (f){
                j--;
            }else {
                i++;
            }
        }
        return max;
    }
}
